模型安全
Uni-Guard 项目详细过程
Uni-Guard 项目工作梳理(2026 年 7 月—8 月)
1. 项目概述
Uni-Guard 是一套文本内容安全审核方案,由两个工程共同组成:
secureEngine:负责 BGE-M3 模型训练,以及预处理、规则匹配、风险评分、策略决策和审计等安全引擎能力。codex_create:负责 Qwen3Guard-Stream 模型部署、数据构造、LoRA 微调、SGLang 评测及模型交付。
整个系统采用分层审核思路:先由速度快、成本低的 BGE-M3 对高置信样本进行放行或拦截,再将难以判断的灰区样本交给 Qwen3Guard-Stream 做更深入的语义安全判断。
用户输入
-> 文本预处理与规则检测
-> BGE-M3 高置信分流
-> 高置信 Safe:直接放行
-> 高置信 Unsafe:直接拦截
-> Grey:交给 Qwen3Guard-Stream
-> 最终安全决策与审计
项目中的两条模型线侧重点不同:
- BGE-M3 是自行训练分类头并进行阈值校准,重点是低延迟、高精度的一级筛选。
- Qwen3Guard-Stream 以 8B 原模型为基础进行 LoRA 微调,主要精力不是修改微调算法,而是清洗数据、构造边界数据、处理标签冲突和调整不同数据的训练权重。
项目迭代中最重要的认识是:安全模型效果的提升主要来自数据质量、数据分布和边界样本定义,而不是单纯增加模型规模或复杂训练方法。
2. 7 月初:搭建安全引擎并拆分 BGE-M3 训练任务
2.1 建立完整安全审核链路
7 月初首先完成了 secureEngine 的整体工程框架,将文本安全审核拆成以下模块:
- 输入适配:统一字符串和结构化请求。
- 文本预处理:完成归一化、编码解码、混淆检测和实体提取。
- 规则引擎:支持高风险规则、中风险规则、白名单和匹配证据。
- 模型推理:加载 BGE-M3 encoder 和不同分类头。
- 风险评分:融合规则分数、模型概率和文本混淆度。
- 策略决策:输出
allow、block或review。 - 审计记录:保存模型版本、规则证据、风险类别、耗时和最终动作。
最终形成了如下端到端链路:
InputAdapter -> Preprocessor -> RuleEngine -> ModelAdapter
-> RiskScorer -> DecisionMaker -> AuditLogger
2.2 将 BGE-M3 拆成 Risk Head 和 Safety Head
BGE-M3 encoder 在训练过程中保持冻结,只在其 CLS embedding 上训练轻量分类头:
- Risk Head:九类风险的多标签分类。
- Safety Head:
safe/unsafe二分类。
这种设计降低了训练和推理成本,也允许两个任务独立准备数据、训练和替换 checkpoint。
2.3 BGE Risk Head 优化
Risk Head 数据规模为:
- train:19,799 条
- valid:2,335 条
- benchmark:1,494 条
风险类别包括暴力、非暴力违法、色情、个人信息、自杀自残、不道德行为、政治敏感、版权和越狱,并加入 negative 样本,使多标签模型能够学习所有类别均为低风险的情况。
训练过程中完成了 14 组实验,比较:
- Linear 与 MLP 分类头
- BCE 与 Focal Loss
- hidden dimension、dropout、学习率和训练轮数
- 正样本权重
最终选择:
Head:MLP512
Loss:BCE
Learning rate:5e-4
Epochs:5
最终 benchmark 指标:
- top1:84.00%
- top2:92.17%
- macro F1:75.80%
正式产物为 bge_m3_risk_head_v2.pt。这一阶段还改造了模型加载器,使其兼容 Linear 和 MLP Risk Head。
3. 7 月 3—4 日:704 BGE Safety Head 数据与训练优化
3.1 构造双模型一致数据
704 阶段使用 Q3 和 MiniMax 对 16,365 条数据进行审核,并采用一致性筛选:
- 两个模型都判合规,保留为 Safe。
- 两个模型都判违规,保留为 Unsafe。
- 两个模型判断不一致,暂时丢弃。
筛选结果:
| 数据 | 数量 |
|---|---|
| Safe | 7,346 |
| Unsafe | 7,123 |
| 不一致丢弃 | 1,896 |
| 最终可用 | 14,469 |
同时准备了 2,000 条人工审核开发集,其中 Safe 837 条、Unsafe 1,163 条。与同源验证集相比,这批人工数据包含更多越狱、角色扮演、间接诱导和复杂边界内容,因此成为后续优化的主要依据。
3.2 704 V1:分类头结构和权重扫描
第一轮比较了:
- Linear、MLP256、MLP512
- unsafe class weight 1.0、1.3、1.5、2.0
- 多组学习率和 epoch
主要结论:
- MLP 明显优于 Linear。
- MLP512 在人工数据上的泛化更好。
- 提高 Unsafe 权重可以降低风险漏判。
- 增加训练轮数对同源测试有效,但对人工集改善有限。
安全优先版本采用 MLP512 + CrossEntropy + unsafe weight 2.0。在人工集上取得:
- Precision:91.76%
- Recall:73.69%
- Accuracy:80.85%
- FN:306
3.3 704 V2:Focal Loss 与训练流程优化
第二轮在不修改数据的情况下优化训练流程:
- 固定随机种子并进行多 seed 实验。
- 引入 CosineAnnealingWarmRestarts。
- 加入 Early Stopping。
- 使用 Focal Loss 关注难分类样本。
最优参数为:
Head:MLP512
Focal gamma:2.0
Unsafe alpha:2.0
Learning rate:5e-4
人工集结果相比 V1:
| 指标 | 704 V1 | 704 V2 |
|---|---|---|
| Recall | 73.69% | 79.71% |
| Precision | 91.76% | 89.74% |
| Accuracy | 80.85% | 82.90% |
| FN | 306 | 236 |
| FP | 77 | 106 |
该版本用可接受的误杀增长换取了 70 条风险漏判的减少。
3.4 704 V3:阈值和更深分类头实验
第三轮进行了两项实验:
- 将 Unsafe 阈值从 0.5 下调到 0.4,人工集 Recall 提升到 81.51%,FN 降到 215。
- 使用三层 MLP 和 LayerNorm,但模型在人工集上的 Recall 降至约 75.3%,表现出明显过拟合。
由此确认:冻结的 BGE-M3 embedding 已具有较强可分性,继续增加分类头深度收益有限;数据、损失函数和阈值更加重要。
4. 7 月 6 日:706 难例补充与召回优化
706 阶段主要针对 704 人工集中的 Unsafe 漏判进行分析和补数,重点覆盖:
- 越狱和提示词攻击
- 角色扮演
- 间接诱导
- 对抗性表达
- 容易被普通语义分类器放过的复杂风险内容
在这一阶段继续比较 CE、Focal、MLP256/512、类别权重和阈值,形成了不同业务运行点:
- 0.5 阈值更加保护正常内容通过率。
- 0.2 等较低阈值更适合降低风险漏放。
- 更低阈值能够进一步提高 Recall,但会增加 Safe 误拦。
706 阶段的主要价值是从追求单一模型指标,转向根据一级分流职责选择运行阈值。
5. 7 月 7—8 日:形成最终 708 BGE 数据和模型
5.1 多模型一致性筛选
708 阶段回到原始运营数据:
- 原始 Safe:8,001 条
- 原始 Unsafe:16,182 条
使用多个安全模型进行交叉审核,只保留高一致性数据,最终得到:
- Safe:5,521 条
- Unsafe:9,761 条(原始 9,763 条,去除 2 条重复)
- 总计:15,282 条
这一轮数据相较 704 更偏向高置信样本,降低了训练标签中的噪声。
5.2 训练 708 Safety Head
最终训练参数为:
Encoder:冻结 BGE-M3
Pooling:CLS
Head:MLP512
Dropout:0.1
Loss:CrossEntropy
Unsafe weight:1.0
Learning rate:3e-4
Epochs:12
Batch size:64
Max length:128
同源测试结果:
- Accuracy:97.12%
- Macro F1:96.89%
- Safe Recall:96.74%
- Unsafe Recall:97.34%
正式产物为 bge_m3_safety_head_708_v1.pt。
5.3 人工开发集阈值校准
在更困难的 2,000 条人工数据上,默认阈值 0.5 的结果为:
- Accuracy:83.85%
- Safe Recall:89.61%
- Unsafe Recall:79.71%
随后在不重新训练模型的情况下扫描阈值,将阈值降至 0.08:
- Accuracy:87.00%
- Safe Recall:83.63%
- Unsafe Recall:89.42%
- Unsafe 漏判率从 20.29% 降至 10.58%
这一结果进一步证明,对 BGE 一级筛选器而言,阈值校准与重新训练同样重要。
6. 7 月中旬:部署 Qwen3Guard 并建立原模型基线
完成 Qwen3Guard-Stream 的运行环境和 SGLang 推理链路,验证 0.6B、4B 和 8B 三种原模型。
旧版 2,000 条 test2 上的结果:
| 模型 | Accuracy | Unsafe Recall | Unsafe F1 |
|---|---|---|---|
| 0.6B | 82.60% | 80.48% | 84.32% |
| 4B | 86.40% | 88.39% | 88.32% |
| 8B | 85.60% | 82.63% | 86.97% |
4B 原模型综合表现最好,8B 的误杀较少、Precision 更高。后续微调主要选择 Qwen3Guard-Stream-8B,以利用更大的模型容量和优化空间。
这一阶段还完成了:
- SGLang 环境搭建和模型加载。
- User Prompt 与 Assistant Response 流式审核验证。
- 数据集批量评测工具。
- 延迟、吞吐和错误样本统计。
- LoRA 模型 merge 后的 SGLang 评测流程。
7. 7 月 15—22 日:第一轮 Qwen LoRA 与 Controversial 问题定位
7.1 Strict/Loose 四模型交叉构造边界数据
参考 Qwen3Guard 的方法,使用 Strict 和 Loose 两种模型,将数据拆成 A、B 两部分,共使用四个模型交叉预测。
从原始 Safe 和 Unsafe 数据中挖掘边界样本:
- Safe 中风险分较高的样本。
- Unsafe 中风险分较低的样本。
- 将这些不确定样本标记为
Controversial。
第一轮训练采用三分类:
Safe / Unsafe / Controversial
并给 Controversial 设置了较高 Loss 权重。
7.2 第一轮结果与问题
同源测试结果很好,但在人工 test2 上出现明显偏移:
- Unsafe Recall 显著提高。
- Unsafe 漏放明显减少。
- 大量 Safe 被预测为 Controversial。
- 生产二分类把 Unsafe 和 Controversial 都折叠为 Risky,因此 FP 大幅增加。
以 0.6B 第一轮 LoRA 为例:
| 指标 | 原模型 | LoRA |
|---|---|---|
| Accuracy | 82.60% | 68.05% |
| Unsafe Recall | 80.48% | 92.86% |
| FN | 227 | 83 |
| FP | 121 | 556 |
问题最终定位为:训练的三分类目标与生产二分类目标不一致,且 Controversial 被强化过度。模型不是没有学到能力,而是学到了过于激进的风险边界。
8. 7 月 27—28 日:从硬三分类转向有方向的边界学习
8.1 727:直接修正 Controversial 的失败尝试
727 尝试把一部分来源于 Safe 的 Controversial 改回 Safe,以降低误杀。
结果虽然减少了部分 Safe 到 Controversial 的错误,但 Unsafe Recall 从 93.29% 降至 72.23%,Unsafe 到 Safe 的漏判增加到 323 条。
由此确认:不能简单删除边界类别或将边界样本全部改成 Safe,否则会损失大量风险召回。
8.2 728:Binary Loss + Soft Three-Class Loss
728 是 Qwen 微调方向的重要转折。边界样本不再使用统一硬标签,而是带有原始方向:
| 样本类型 | Binary 目标 | Soft 三分类目标 |
|---|---|---|
| Clean Safe | Safe | Safe=1.0 |
| Clean Unsafe | Risky | Unsafe=1.0 |
| Safe 来源边界 | Safe | Safe=0.75,Controversial=0.25 |
| Unsafe 来源边界 | Risky | Unsafe=0.35,Controversial=0.65 |
训练目标改为:
loss = 1.0 * binary_loss + 0.3 * soft_three_class_loss
Risky logit = logsumexp(Unsafe, Controversial)
这一方法让模型以生产二分类为主要目标,同时保留对边界不确定性的学习。
三 API 版本在旧 test2 上取得:
- Accuracy:89.35%
- Unsafe Recall:91.75%
- F1:90.92%
同时确认 template_last 的训练位置与 SGLang 推理口径更加一致。
9. 7 月 28 日—8 月初:三方审核十桶数据实验
9.1 使用三家安全服务重新组织数据
对原始 8,001 条 Safe 和 16,182 条 Unsafe 分别调用腾讯、阿里和百度安全审核服务。三家服务均返回 Block、Review 或 Pass,根据合规服务数量形成十个数据桶:
| 原始标签 | 3 合规 | 2 合规 | 其他 | 1 合规 | 0 合规 |
|---|---|---|---|---|---|
| Safe | 4,992(桶1) | 1,568(桶2) | 406(桶3) | 727(桶4) | 308(桶5) |
| Unsafe | 2,215(桶6) | 3,108(桶7) | 1,925(桶8) | 4,641(桶9) | 4,293(桶10) |
其中最关键的是标签与三方审核结果冲突的桶 6 和桶 7:
- 桶 6:原始标签为 Unsafe,但三家服务全部判合规。
- 桶 7:原始标签为 Unsafe,但两家服务判合规。
9.2 728.1—728.3:验证不同边界桶
- 728.1:主要使用桶 7 作为边界数据。
- 728.2:主要使用桶 6。
- 728.3:联合使用桶 6 和桶 7。
结果表明:
- 桶 7 是相对稳定、健康的边界数据。
- 单独使用桶 6 会产生大量误杀。
- 桶 6+7 可以显著提高 Recall,但需要继续处理桶 6 带来的 Safe 误伤。
728.3 达到:
- Accuracy:90.10%
- Unsafe Recall:95.79%
- F1:91.84%
9.3 729:对冲突数据分层降权
729.1 不再将桶 6 中的所有数据等权使用,而是根据风险和冲突程度分层降权,并对 Safe hard case 加权。
同时完成了:
- 学习率对比。
- Soft loss 权重调整。
- 不同训练 checkpoint 扫描。
- Unsafe 下采样实验。
代表性结果:
- 综合 Accuracy 最好:
729.1 lr1e-4 soft0.2,Accuracy 90.30%。 - Recall 最高:729.1 checkpoint step380,Unsafe Recall 96.13%。
- checkpoint step400 在误杀和漏放之间较均衡。
9.4 730 与 802:继续拆解桶 6、7
后续版本继续从数据角度处理冲突样本:
- 去除 prompt 重复和标签冲突。
- 使用 Strict 模型从桶 6、7 中筛选可能为 Safe 的数据。
- 将剩余数据保留为 Controversial。
- 单独处理政治敏感和公共议题类内容。
- 尝试替换边界数据来源和不同 Safe/Unsafe 组合。
802.3 达到:
- Accuracy:89.60%
- Unsafe Recall:93.98%
- F1:91.31%
这一系列实验进一步说明,Qwen 模型优化的关键是判断冲突数据究竟应作为 Safe、Unsafe 还是 Boundary,而不是修改 LoRA 的基本训练方法。
10. 8 月 3—4 日:确定 BGE 高置信分流方案
8 月初开始将 BGE 明确定位为一级高置信分流器,而不是要求它独立覆盖全部数据。
主要工作包括:
- 在人工数据上扫描极高阈值。
- 使用
0.9999/0.99999等双侧阈值划分 block、pass 和 grey。 - 分析 BGE false block 样本。
- 对高置信误杀进行模型和规则归因。
- 准备核心数据、形式扩展数据和内容扩展数据进行专项测试。
- 测试更长输入长度对长文本的影响。
两组典型结果:
| Block Precision | Block Recall | Block 数量 | Pass 数量 | Grey 数量 |
|---|---|---|---|---|
| 98.46% | 43.94% | 519 | 453 | 1,028 |
| 99.50% | 34.14% | 399 | 341 | 1,260 |
这说明 BGE 可以高精度处理两端样本,将一半以上的不确定请求留给千问模型,从而在效果和推理成本之间取得平衡。
11. 8 月 6—7 日:统一实验口径并训练 807 版本
11.1 汇总历史实验
对 722、727、728、729、730 和 802 系列进行了统一汇总,形成以下结论:
- 原始三分类会过度强化 Controversial。
- 直接删除边界数据会导致 Recall 下降。
- Binary + Soft Three-Class Loss 是更合适的训练目标。
- 三 API 十桶数据比早期分位数构造更容易解释。
- 桶 6、7 的处理方式决定了 FP 与 FN 的平衡。
11.2 修正开发集版本
此前部分实验使用旧版 test2,随后统一切换到 test2_20260715:
- Safe:916
- Unsafe:1,084
- 总计:2,000
同时完成:
- 清理桶 6、7 中的重复和冲突数据。
- 分析人工开发集中的错误样本。
- 根据 bad case 对桶 6、7 重新分类和补充。
- 构建 807.1 和 807.2 两套训练数据。
评测结果:
| 模型 | Accuracy | FP | FN | Unsafe Recall | F1 |
|---|---|---|---|---|---|
| 8B 原模型 | 87.25% | 109 | 146 | 86.53% | 88.03% |
| 807.1 | 88.45% | 185 | 46 | 95.76% | 89.99% |
| 807.2 | 88.90% | 171 | 51 | 95.30% | 90.30% |
807.1 的 Recall 略高,807.2 的 Accuracy、F1 和误杀表现更加均衡,因此选择 807.2 作为主要候选。
12. 8 月 9—10 日:809 系列目标函数消融
基于 807.2 构建四种版本,系统研究 Controversial 数据的作用:
- 807.2B:强化三分类目标。
- 807.2C:提高 Safe binary 权重,降低 Controversial 权重。
- 809.1:移除 Controversial,只保留 Safe 和 Unsafe。
- 809.2:保留 Controversial,但降低其训练权重,同时提高 Safe 权重。
结果:
| 版本 | Accuracy | FP | FN | Unsafe Recall | F1 |
|---|---|---|---|---|---|
| 807.2A | 88.90% | 171 | 51 | 95.30% | 90.30% |
| 807.2B | 88.55% | 186 | 43 | 96.03% | 90.09% |
| 807.2C | 89.50% | 152 | 58 | 94.65% | 90.72% |
| 809.1 | 89.05% | 129 | 90 | 91.70% | 90.08% |
| 809.2 | 89.60% | 145 | 63 | 94.19% | 90.76% |
实验结论:
- 强化三分类可以获得最高 Recall,但误杀最重。
- 完全删除 Controversial 可以降低 FP,但会明显增加 FN。
- 保留并降低 Controversial 权重是更好的折中。
- 809.2 是这一轮综合指标最好的版本。
13. 8 月 11 日:补充 Safe 数据实验
811.1 在 807.2 的基础上补充了 1,079 条 Safe 数据,并明确排除与 test2_20260715 精确重复的 prompt。
训练结果:
- Accuracy:87.70%
- Precision:86.88%
- Recall:91.05%
- F1:88.92%
- FP:149
- FN:97
该版本没有超过 807.2 或 809.2,说明单纯增加 Safe 数据量并不能保证提升效果。补充数据必须精确覆盖当前模型的误杀边界,并保持与实际业务数据一致。
14. 8 月中旬:模型整理、部署和交付
最后将 807.2/807.2A 整理为完整交付包,包括:
- 训练数据和数据统计。
- 数据构造脚本。
- LoRA 训练配置和训练入口。
- LoRA adapter。
- Merge 后可直接用于 SGLang 的完整模型。
- test2 原始推理日志。
- 二分类与三分类评测报告。
- 错误样本明细。
- 模型复现、部署和目录说明。
交付版本主要训练参数:
Base model:Qwen3Guard-Stream-8B
Train mode:query_only
Query position:template_last
Epochs:1
Learning rate:2e-4
Effective batch size:32
Max length:2048
Binary loss weight:1.0
Soft three-class loss weight:0.3
LoRA r / alpha / dropout:16 / 32 / 0.05
同时完成了 SGLang 推理部署、LoRA merge、批量评测、延迟测试和模型交付说明,形成从数据处理、模型训练到上线验证的完整闭环。
15. 项目中主要完成的工作
15.1 数据工作
数据处理是整个项目投入最多、对结果影响最大的部分,主要包括:
- 整理运营日志、金标数据和可用数据。
- 使用 Q3、MiniMax 进行双模型一致性筛选。
- 使用多个模型交叉判断 Safe/Unsafe。
- 调用腾讯、阿里和百度安全审核服务并形成十桶数据。
- 构造 Strict/Loose、A/B 四模型交叉预测数据。
- 构造和修正 Controversial/Boundary 数据。
- 去重、排查标签冲突和开发集重叠。
- 分析 false positive、false negative 和高置信误判。
- 针对越狱、政治敏感、角色扮演、诱导和长文本补充难例。
- 对冲突桶进行拆分、降权、重标和组合实验。
- 建立 train、valid、test 和人工开发集的评测体系。
15.2 BGE-M3 模型工作
- 训练九类 Risk Head。
- 训练 Safe/Unsafe Safety Head。
- 比较 Linear、MLP256、MLP512 和更深 MLP。
- 比较 BCE、CrossEntropy 和 Focal Loss。
- 引入 scheduler、early stopping 和多 seed 实验。
- 完成 704、706、708 多轮数据迭代。
- 完成阈值扫描和高置信双侧分流。
- 将 BGE 定位为低延迟一级审核模型。
15.3 Qwen3Guard-Stream 模型工作
- 部署并评测 0.6B、4B 和 8B 原模型。
- 建立 Qwen3Guard LoRA 微调流程。
- 训练 User Prompt/Query 安全判断能力。
- 从硬三分类逐步改为 Binary + Soft Three-Class。
- 统一训练和 SGLang 推理的
template_last位置。 - 完成 722、727、728、729、730、802、807、809、811 等版本实验。
- 完成 LoRA merge、SGLang 批量评测和结果对比。
- 形成可直接交付的 adapter 和 merged 模型。
15.4 工程与交付工作
- 实现安全引擎端到端链路。
- 建立 YAML 配置化的规则、模型和策略。
- 编写数据转换、训练、评估和阈值扫描脚本。
- 建立离线评测和错误样本分析工具。
- 搭建 Qwen3Guard SGLang 运行环境。
- 完成模型延迟和吞吐测试。
- 整理模型、数据、日志、文档和复现脚本。
16. 最终成果与经验总结
项目最终形成了一个分层的 Uni-Guard 文本安全方案:
- BGE-M3 负责高置信、低延迟的一级分流。
- Risk Head 提供九类风险归因。
- Qwen3Guard-Stream-8B 负责处理 BGE 灰区和复杂语义。
- 规则、模型概率和策略阈值共同决定最终动作。
从 7 月到 8 月,模型优化的主线并不是不断改变训练算法,而是不断提高数据与业务目标的一致性:
- 从直接信任原始标签,转向多模型和多 API 交叉审核。
- 从简单 Safe/Unsafe 数据,转向重点研究标签冲突的边界样本。
- 从硬 Controversial 标签,转向带来源方向的 Soft Boundary。
- 从只看同源测试集,转向使用人工开发集分析真实 bad case。
- 从追求单模型全覆盖,转向 BGE 高置信分流与 Qwen 灰区审核的级联方案。
- 从单纯追求 Recall,转向根据业务成本平衡 FP、FN、模型延迟和灰区比例。
最终的核心经验是:安全审核任务的性能上限很大程度上由数据决定。模型微调方法保持相对稳定时,通过清洗标签、识别冲突样本、构造正确的边界目标、调整不同数据权重和建立可靠评测集,仍然能够持续获得明显提升。
17. 2,000 条人工数据实验结果
以下二分类结果均以 Unsafe 为正类:
- TP:正确识别的 Unsafe;
- FP:Safe 被误判为风险,即正常内容误杀;
- FN:Unsafe 被误判为 Safe,即风险内容漏放;
- TN:正确识别的 Safe;
- Precision:模型判为风险的样本中,真正 Unsafe 的比例;
- Recall:全部 Unsafe 中被成功识别的比例。
项目使用过两版不同的 2,000 条人工数据,结果不能直接混合比较:
| 数据集 | Safe | Unsafe | 用途 |
|---|---|---|---|
| 旧版 test2 | 837 | 1,163 | BGE 704/708、Qwen 早期版本评测 |
| 新版 test2_20260715 | 916 | 1,084 | Qwen 807—811 数据对齐、调权和选模 |
新版 test2_20260715 参与了错误分析、数据对齐和模型选择,因此相关结果属于人工开发集指标,不是完全独立测试集指标。
17.1 BGE-M3 在旧版人工 test2 上的实验
| 版本 | TP | FP | FN | TN | Accuracy | Precision | Recall | F1 |
|---|---|---|---|---|---|---|---|---|
| 704 V1 | 857 | 77 | 306 | 760 | 80.85% | 91.76% | 73.69% | 81.74% |
| 704 V2 | 927 | 106 | 236 | 731 | 82.90% | 89.74% | 79.71% | 84.43% |
| 704 V2 threshold 0.40 | 948 | 128 | 215 | 709 | 82.85% | 88.10% | 81.51% | 84.68% |
| 708 V1 threshold 0.50 | 927 | 87 | 236 | 750 | 83.85% | 91.42% | 79.71% | 85.16% |
| 708 V2 threshold 0.08 | 1,040 | 137 | 123 | 700 | 87.00% | 88.36% | 89.42% | 88.89% |
BGE 高置信分流结果:
| 运行点 | Block | Pass | Grey | TP | FP | FN | Block Precision | Block Recall | F1 |
|---|---|---|---|---|---|---|---|---|---|
| 较高覆盖 | 519 | 453 | 1,028 | 511 | 8 | 652 | 98.46% | 43.94% | 60.76% |
| 更高精度 | 399 | 341 | 1,260 | 397 | 2 | 766 | 99.50% | 34.14% | 50.83% |
这里的 FN 表示没有被 BGE 直接 Block 的 Unsafe,不等于系统最终漏放,其中大部分会进入 Grey 区并由 Qwen3Guard 复审。
17.2 Qwen3Guard 在旧版人工 test2 上的实验
| 版本 | TP | FP | FN | TN | Accuracy | Precision | Recall | F1 |
|---|---|---|---|---|---|---|---|---|
| 8B 原模型 | 961 | 86 | 202 | 751 | 85.60% | 91.79% | 82.63% | 86.97% |
| 722 V2 | 1,111 | 342 | 52 | 495 | 80.30% | 76.46% | 95.53% | 84.94% |
| 728 Boundary | 1,075 | 205 | 88 | 632 | 85.35% | 83.98% | 92.43% | 88.01% |
| 728.1 | 1,067 | 117 | 96 | 720 | 89.35% | 90.12% | 91.75% | 90.92% |
| 728.3 | 1,114 | 149 | 49 | 688 | 90.10% | 88.20% | 95.79% | 91.84% |
| 729.1 lr1e-4 soft0.2 | 1,082 | 113 | 81 | 724 | 90.30% | 90.54% | 93.04% | 91.77% |
| 802.3 | 1,093 | 138 | 70 | 699 | 89.60% | 88.79% | 93.98% | 91.31% |
722 将 FN 从 202 降到 52,但 FP 从 86 增至 342,说明模型过度偏向风险侧。后续版本通过三方 API 分桶、边界数据拆分和权重调整,在误杀与漏放之间取得更好的平衡。
17.3 Qwen3Guard 在新版人工开发集上的实验
| 版本 | TP | FP | FN | TN | Accuracy | Precision | Recall | F1 |
|---|---|---|---|---|---|---|---|---|
| 8B 原模型 | 938 | 109 | 146 | 807 | 87.25% | 89.59% | 86.53% | 88.03% |
| 807.1 | 1,038 | 185 | 46 | 731 | 88.45% | 84.87% | 95.76% | 89.99% |
| 807.2A | 1,033 | 171 | 51 | 745 | 88.90% | 85.80% | 95.30% | 90.30% |
| 807.2B | 1,041 | 186 | 43 | 730 | 88.55% | 84.84% | 96.03% | 90.09% |
| 807.2C | 1,026 | 152 | 58 | 764 | 89.50% | 87.10% | 94.65% | 90.72% |
| 809.1 | 994 | 129 | 90 | 787 | 89.05% | 88.51% | 91.70% | 90.08% |
| 809.2 | 1,021 | 145 | 63 | 771 | 89.60% | 87.56% | 94.19% | 90.76% |
| 811.1 | 987 | 149 | 97 | 767 | 87.70% | 86.88% | 91.05% | 88.92% |
主要结论:
- 807.2A 相比 807.1 减少 14 条 FP,只增加 5 条 FN,证明第 6、7 桶重新对齐有效;
- 807.2B 的 Recall 最高,但 FP 也最高,纯三分类不是最佳方向;
- 809.1 删除 Controversial 后 FP 降低,但 FN 增至 90,说明边界数据不能完全删除;
- 807.2C/809.2 低权重保留边界数据,在误杀与漏放之间取得较好平衡;
- 807.2C 和 809.2 使用相同数据、权重和训练参数,结果差异属于独立训练波动;
- 811.1 单纯增加 Safe 数据没有提升,说明需要补充困难 Safe,而不是只增加普通 Safe 数量。
17.4 最终结果对比
以新版人工开发集上的 809.2 单次结果与 8B 原模型比较:
| 指标 | 8B 原模型 | 809.2 | 变化 |
|---|---|---|---|
| Accuracy | 87.25% | 89.60% | +2.35 个百分点 |
| Precision | 89.59% | 87.56% | -2.03 个百分点 |
| Unsafe Recall | 86.53% | 94.19% | +7.66 个百分点 |
| F1 | 88.03% | 90.76% | +2.73 个百分点 |
| FP | 109 | 145 | +36 |
| FN | 146 | 63 | -83 |
| 总错误数 | 255 | 208 | -47 |
最终模型显著降低了风险漏放,代价是增加部分正常内容误杀。Uni-Guard 通过 BGE 高置信分流、Qwen 灰区复审和 review 路由,对两类错误进行分层控制。